package cn.juque.datapipeline.datasource;

import cn.juque.datapipeline.api.enums.DbEnum;
import cn.juque.datapipeline.bo.WriteParamBO;
import cn.juque.datapipeline.entity.DatabaseInfo;

import java.util.List;
import java.util.Map;

/**
 * @author juque
 * @version 1.0.0
 * <ul>
 *     <li>IDatasource</li>
 * </ul>
 * @date 2023-04-04 22:19:34
 **/
public abstract class AbstractDatasource {

    private DbEnum dbEnum;

    /**
     * 创建链接
     *
     * @param databaseInfo 驱动信息
     * @return 读写驱动
     */
    public abstract Object createConnection(DatabaseInfo databaseInfo);

    /**
     * 读取数据
     *
     * @param connection 连接
     * @param script     脚本
     * @return 结果集
     */
    public abstract List<Map<String, Object>> inData(Object connection, String script);

    /**
     * 插入
     *
     * @param writeParamBO 参数
     * @return 操作的数据量
     */
    public abstract Long insert(WriteParamBO writeParamBO);

    /**
     * 更新
     *
     * @param writeParamBO 参数
     * @return 操作的数据量
     */
    public abstract Long update(WriteParamBO writeParamBO);

    /**
     * 更新或删除
     *
     * @param writeParamBO 参数
     * @return 操作的数据量
     */
    public abstract Long saveOrUpdate(WriteParamBO writeParamBO);

    /**
     * 删除
     *
     * @param writeParamBO 参数
     * @return 操作的数据量
     */
    public abstract Long delete(WriteParamBO writeParamBO);

    /**
     * 清空目标表的数据
     *
     * @param databaseInfo 驱动信息
     * @param tableName    表名
     */
    public abstract void truncate(DatabaseInfo databaseInfo, String tableName);

    /**
     * 写入数据
     *
     * @param writeParamBO 参数
     * @return 操作的数据量
     */
    public Long outData(WriteParamBO writeParamBO) {
        switch (writeParamBO.getOpTypeEnum()) {
            case INSERT:
                return this.insert(writeParamBO);
            case UPDATE:
                return this.update(writeParamBO);
            case DELETE:
                return this.delete(writeParamBO);
            case INSERT_OR_UPDATE:
                return this.saveOrUpdate(writeParamBO);
            default:
                break;
        }
        return 0L;
    }

    /**
     * 标志当前驱动的db类型
     *
     * @param dbEnum DbEnum
     */
    public void markDb(DbEnum dbEnum) {
        this.dbEnum = dbEnum;
    }

    public DbEnum getDbType() {
        return this.dbEnum;
    }
}
